from student import *

class StudentManager(object):

    # 类属性
    # 定义显示功能字典
    func_show_dict = {
        1: '添加学员',
        2: '删除学员',
        3: '修改学员信息',
        4: '查询学员信息',
        5: '显示所有学员信息',
        6: '保存学员信息',
        7: '退出系统',
    }

    # 定义执行功能字典
    func_execute_dict = {
        1: 'self.add_student()',
        2: 'self.del_student()',
        3: 'self.modify_student()',
        4: 'self.search_student()',
        5: 'self.show_student()',
        6: 'self.save_student()',
        7: '退出系统',
    }

    def __init__(self):
        self.student_list = []

    # 定义程序入口函数
    def run(self):
        # 1. 加载学员信息
        self.load_student()


        while True:
            # 2. 显示功能菜单
            self.show_menu()

            # 3. 用户输入功能序号
            menu_num = int(input('请输入您需要的功能序号: '))

            # 根据用户输入的功能序号执行不同的功能列表
            if menu_num == 7:
                break
            elif self.func_show_dict.get(menu_num) is not None:
                eval(self.func_execute_dict.get(menu_num))
            else:
                print('输入错误，请重新输入!!!')

        # 保存学员信息
        self.save_student()

    # 定义系统功能函数

    # 2.1 显示功能菜单
    '''
    既不需要使用实例对象, 也不需要使用类对象 → 静态方法
    但我们这里调用了 类属性, 所以不使用静态方法, 而使用 类方法
    '''
    @classmethod
    def show_menu(cls):
        print("请选择功能：")
        for key, value in cls.func_show_dict.items():
            print("{}-{}".format(key, value))
        print("-" * 20)

    # 2.2 添加学员
    def add_student(self):
        print('---添加过程---')
        name = input('请输入您的姓名: ')
        gender = input('请输入您的性别: ')
        tel = input('请输入您的手机号: ')

        student = Student(name, gender, tel)
        self.student_list.append(student)  # 不需要转换成字典存储, 直接存储该对象

        # 打印信息
        print('# 当前所有学员信息:')
        print(self.student_list)
        print('*'*20)

    # 2.3 删除学员
    def del_student(self):
        print('---删除过程---')
        del_name = input('请输入要删除的学员姓名: ')

        for i in self.student_list:
            if i.name == del_name:
                self.student_list.remove(i)
                break
        else:
            print('查无此人')

        # 打印信息
        print('# 当前所有学员信息:')
        print(self.student_list)
        print('*' * 20)

    # 2.4 修改学员信息
    def modify_student(self):
        print('---修改过程---')
        modify_name = input('请输入要修改的学员姓名: ')

        for i in self.student_list:
            if i.name == modify_name:
                i.name = input('请输入新的学员姓名: ')
                i.gender = input('请输入新的学员性别: ')
                i.tel = input('请输入新的学员手机号: ')
                print(f'修改该学员信息成功，姓名{i.name},性别{i.gender}, 手机号{i.tel}')
                break
        else:
            print('查无此人')

        # 打印信息
        print('# 当前所有学员信息:')
        print(self.student_list)
        print('*' * 20)

    # 2.5 查询学员信息
    def search_student(self):
        print('---查询过程---')
        search_name = input('请输入要查询的学员姓名: ')

        for i in self.student_list:
            if i.name == search_name:
                print(f'姓名{i.name},性别{i.gender}, 手机号{i.tel}')
                break
        else:
            print('查无此人')
        print('*' * 20)

        # 打印信息
        print('# 当前所有学员信息:')
        print(self.student_list)
        print('*' * 20)

    # 2.6 显示所有学员信息
    def show_student(self):
        print('---所有学员信息---')
        print('姓名\t性别\t手机号')
        for i in self.student_list:
            print(f'{i.name}\t{i.gender}\t{i.tel}')
        print('*' * 20)

    # 2.7 保存学员信息
    def save_student(self):
        print('---信息保存完成---')
        f = open('student.data', 'w')
        temp_list = [i.__dict__ for i in self.student_list]

        print(temp_list)

        # 注意2：文件内数据要求为字符串类型，故需要先转换数据类型为字符串才能文件写入数据
        f.write(str(temp_list))

        f.close()
        print('*' * 20)

    # 2.8 加载学员信息
    def load_student(self):
        print('---学员信息加载中---')
        try:
            f = open('student.data', 'r')
        except:
            f = open('student.data', 'w')  # 这一行代码写成 py 了，导致每次都把我 student.py 文件修改了
        else:  # 没有异常执行的代码

            # 1. 读取数据
            data = f.read()

            # 2. 文件中读取的数据都是字符串且字符串内部为字典数据，故需要转换数据类型再转换字典为对象后存储到学员列表
            temp_list = eval(data)
            self.student_list = [Student(i['name'], i['gender'], i['tel']) for i in temp_list]

        finally:
            f.close()